#include <iostream>
using namespace std;
// TIP 要<b>Run</b>代码，请按 <shortcut actionId="Run"/> 或点击装订区域中的 <icon src="AllIcons.Actions.Execute"/> 图标。

int func() {
    int n, s;
    cin >> n >> s;
    vector<int> w(n+1);
    for (int i = 1; i <= n; i++) cin >> w[i];

    vector<vector<long long>> dp(n+1, vector<long long>(s+1, 0));
    dp[0][0] = 1; // 初始：选 0 个数时，和为 0 的方案数 = 1

    for (int i = 1; i <= n; i++) {
        for (int j = 0; j <= s; j++) {
            dp[i][j] = dp[i-1][j]; // 不选 w[i]
            if (j >= w[i]) dp[i][j] += dp[i-1][j-w[i]]; // 选 w[i]
        }
    }

    cout << dp[n][s] << endl;
    return 0;
}

int solve(int N) {
    vector<int> digits;
    int tmp = N;
    while (tmp > 0) {
        digits.push_back(tmp % 10);
        tmp /= 10;
    }
    reverse(digits.begin(), digits.end()); // 转成高位在前

    int n = digits.size();
    int i = n - 2;

    // 1. 找到第一个递增位置
    while (i >= 0 && digits[i] >= digits[i+1]) i--;
    if (i < 0) return -1; // 全降序，没有更大排列

    // 2. 找到右边比 digits[i] 大的最小数
    int j = n - 1;
    while (j > i && digits[j] <= digits[i]) j--;

    // 3. 交换
    swap(digits[i], digits[j]);

    // 4. i 之后升序排列
    reverse(digits.begin() + i + 1, digits.end());

    // 5. 转回整数
    long long ans = 0;
    for (int d : digits) ans = ans * 10 + d;

    return (ans > N ? ans : -1);
}

#include<set>
int func2() {
    ios::sync_with_stdio(false);
    cin.tie(nullptr);

    int n;
    cin >> n;
    vector<int> h(n);
    for (int i = 0; i < n; i++) cin >> h[i];

    vector<int> ans(n, -1);
    set<int> st; // 用来维护右边出现过的高度（有序）
    for (int i = n - 1; i >= 0; i--) {
        auto it = st.upper_bound(h[i]); // 找到比 h[i] 大的最小数
        if (it != st.end()) ans[i] = *it;
        st.insert(h[i]); // 把当前数放进去
    }

    for (int i = 0; i < n; i++) {
        if (i) cout << " ";
        cout << ans[i];
    }
    cout << "\n";

    return 0;
}

ListNode* sort(ListNode* head) {
    if (!head) return nullptr;

    bool swapped;
    do {
        swapped = false;
        ListNode* curr = head;

        while (curr && curr->get_next()) {
            ListNode* nxt = curr->get_next();

            if (curr->get_data() > nxt->get_data()) {
                // 交换 curr 和 nxt 两个节点
                ListNode* prev = curr->get_prev();
                ListNode* nextNext = nxt->get_next();

                // prev -> nxt
                if (prev) prev->set_next(nxt);
                nxt->set_prev(prev);

                // nxt -> curr
                nxt->set_next(curr);
                curr->set_prev(nxt);

                // curr -> nextNext
                curr->set_next(nextNext);
                if (nextNext) nextNext->set_prev(curr);

                // 如果换到了链表头，需要更新 head
                if (head == curr) head = nxt;

                swapped = true;
            } else {
                curr = curr->get_next();
            }
        }
    } while (swapped);

    return head;
}
